//
//  UserAccountViewModel.swift
//  glzbowei
//
//  Created by 高伦展 on 2017/12/20.
//  Copyright © 2017年 glz. All rights reserved.
//

import Foundation

/// 用户账号视图模型 - 没有父类

/**
    模型通常继承自 NSObject -> 可以使用 KVC 设置属性，简化对象构造
    如果没有父类，所有的内容，都需要从头创建，量级更轻
 
    视图模型的作用：封装 ‘业务逻辑’，通常没有复杂的属性
 
 */


class UserAccountViewModel{
    
    //单例 - 解决避免重复从沙盒加载 归档 文件，提高效率，
    static let sharedUserAccount = UserAccountViewModel()
    
    //用户模型
    var account:UserAccount?
    
    var accessToken:String?{
        
        if !isExpired{
            return account?.access_token
        }
        
        return nil
    }
    
    //用户登录记录
    var userLogin:Bool{
        return account?.access_token != nil && !isExpired
    }
    
    //用户头像
    var avatarUrl:URL{
        return URL(string: account?.avatar_large ?? "")!
    }
    
    //归档保存的路径 - 计算型属性（类似于有返回值的函数，可以让调用的时候，语义会更清晰）
    //如果在 OC 中，可以通过只读属性/函数的方式实现
    private var accountPath:String{
        
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask,true).last!
        
        //
       return (path as NSString).appendingPathComponent("account.plist")
        
    }
    
    //判断账号是否过期
    private var isExpired:Bool{
         
        //account?.expireDate = Date(timeIntervalSinceNow:-2600)
        
        if account?.expireDate?.compare(Date()) == .orderedDescending
        {
            return false;
        }
        return true;
    }
    
    ///构造函数 私有化 ，要求外部只能通过单例
    private init() {
        //从沙盒解档数据，恢复当前数据
        account = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as? UserAccount
       
        //判断token是否过期
        if isExpired {
            print("已经过期")
            
            account = nil
        }
        
    }
}

extension UserAccountViewModel{
    
    //加载 token
    func loadAccessToken(code: String,finished:@escaping (_ isSuccessed:Bool)->()){
        NetworkTools.sharedTools.loadAccessToken(code: String(code)) { (result,error) -> () in
            if(error != nil){
                print("出错了")
                
                finished(false)
                return
            }
            
            self.account = UserAccount(dict: result as! [String : AnyObject])
            self.loadUserInfo(account: self.account!,finished: finished)
        }
    }
    
    //回调通知调用方
    private func loadUserInfo(account:UserAccount,finished:@escaping (_ isSuccessed:Bool)->()){
        
        NetworkTools.sharedTools.loadUserInfo(uid: account.uid!){
            (result,error) -> () in
            if(error != nil){
                print("加载用户出错了")
                
                finished(false)
                return
            }
            
            //提示：如果使用 if let / guard let 统统使用 ‘？’
            //作了两个判断
            //1.result 一定有内容
            //2.一定是字典
            guard let dict = result as? [String:AnyObject] else{
                print("格式错误")
                
                finished(false)
                return
            }
            account.screen_name =  (dict["screen_name"] as? String)
            account.avatar_large = (dict["avatar_large"] as? String)
            
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            finished(true)
        }
    }
}
